<%@page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1" import="com.agv.core.util.*,java.util.*,com.agv.core.objectDomain.TipoGrid" %>
<%@ page import="net.sf.json.*" %>
<%@ page import="java.sql.Timestamp" %>
<%@ page import="java.math.BigDecimal" %>

<%!
    private String primaryKey;
    private Map<String, String> agrega;
    private String objetoNuevoJson;
    private Map<String, Map<String, String>> catalogos;
    private String columnasJson;

    private String datosJson;
    String jsonPrimerGrid;
%><%
/*
    GridPojo pojo = new GridPojo();

    pojo.setSecuencia("lolo");
    pojo.setUrlAlta("respuestaInsert.jsp");
    pojo.setUrlBaja("respuestaInsert.jsp");
    pojo.setUrlCambios("respuestaInsertp.jsp");
    pojo.setNombreTabla("estatus");
    pojo.setUrlSegundoGrid("gridPojo2.jsp");

    List<Map<String, Object>> listaDatos2 = new ArrayList<Map<String, Object>>();


    Map<String, Object> modelo2 = new LinkedHashMap<String, Object>();

    //HEADER
    modelo2.put("idestatus", "java.lang.Integer");
    modelo2.put("a12345678901234567890", "java.lang.String");
    modelo2.put("costo", "java.math.BigDecimal");
    modelo2.put("activo", "java.lang.Integer");
    modelo2.put("fecha", "java.util.Date");      //la fecha es un string con el formato dd/mm/yyyy
    modelo2.put("pais", "java.lang.String");   //catalogo  aqui realmente no me importa el tipo de dato
    modelo2.put("planeta", "java.lang.String");  //catalogo   aqui realmente no me importa el tipo de dato


    listaDatos2.add(modelo2);
    //DATOS
    for (int l = 0; l < 5; l++) {
        modelo2 = new LinkedHashMap<String, Object>();

        modelo2.put("idestatus", 1 + l);
        modelo2.put("a12345678901234567890", "Arturo Govea " + l);
        modelo2.put("costo", new java.math.BigDecimal(3.124f).floatValue() + l);
        modelo2.put("activo", true);
        modelo2.put("fecha", "05/03/198" + l);
        modelo2.put("pais", 1);   //aqui pones el dato como se tiene que ver
        modelo2.put("planeta", 2);


        listaDatos2.add(modelo2);
    }




    pojo.setDatosTabla(listaDatos2);

    List<String> bo = new ArrayList<String>();
    bo.add("activo");

    pojo.setBooleanos(bo);

    HashMap<String, Map<String, String>> pais = new HashMap<String, Map<String, String>>();

    HashMap<String, String> catalogo = new HashMap<String, String>();

    catalogo.put("1", "Mexico");
    catalogo.put("2", "Cuba");
    catalogo.put("3", "Jamaica");
    pais.put("pais", catalogo);

    catalogo = new HashMap<String, String>();

    catalogo.put("1", "Tierra");
    catalogo.put("2", "Marte");
    catalogo.put("3", "Jupiter");
    pais.put("planeta", catalogo);

    pojo.setCatalogos(pais);
*/

 
   // request.setAttribute("griPojo", pojo);


    /**************************CONFIGURACION DE VARIABLES****************************************************/

    //Como se llama el atributo del request que trae el GridPojo
    String nombrePojo = "griPojo";


    /*****************************************************************************************************************/

    GridPojo gridPojo = (GridPojo) request.getAttribute(nombrePojo);


    Map<String, Object> modelo;
    List<Map<String, Object>> listaDatos = null;
    Iterator it = null;

    List<TipoGrid> listaModelo = null;
    List<Map> listColumnas = null;

    if (gridPojo != null && gridPojo.getDatosTabla() != null && gridPojo.getNombreTabla() != null) {


        listaDatos = gridPojo.getDatosTabla();
        catalogos = gridPojo.getCatalogos();

        List<String> booleanos = gridPojo.getBooleanos();


        modelo = listaDatos.get(0);
        agrega = new HashMap<String, String>();
        it = modelo.entrySet().iterator();

        listaModelo = new ArrayList<TipoGrid>();
        listColumnas = new ArrayList<Map>();
        boolean pk = true;
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            //System.out.println(e.getKey() + " " + e.getValue());
            Object miO = e.getValue();
            agrega.put((String) e.getKey(), "");
            if (miO != null) {


                HashMap columnas = new HashMap();


                columnas.put("dataIndex", e.getKey().toString());
                columnas.put("sortable", true);
                columnas.put("header", e.getKey().toString());
                columnas.put("width", 100);
                if(e.getKey().toString().length()>=15)
                columnas.put("width", 200);



                listColumnas.add(columnas);

                //checo si es catalogo
                if (catalogos.containsKey(e.getKey())) {


                    TipoGrid tipoGrid = new TipoGrid();

                    tipoGrid.setName(e.getKey().toString());
                    tipoGrid.setType("string");
                    tipoGrid.setXtype("combo");
                     columnas.put("dataIndex", e.getKey().toString());
                    columnas.put("xtype", "combocolumn");
                    columnas.put("gridId", e.getKey().toString() + "comboExtSol2");

                    HashMap xtype = new HashMap();
                    xtype.put("id", e.getKey().toString() + "comboExt2");
                    xtype.put("allowBlank", false);
                    xtype.put("xtype", "combo");
                    xtype.put("triggerAction", "all");
                    xtype.put("transform", e.getKey().toString() + "combo2");
                    xtype.put("editable", true);
                    xtype.put("forceSelection", true);
                    xtype.put("lazyRender", true);

                    xtype.put("listClass", "x-combo-list-small");
                    columnas.put("editor", xtype);


                    listaModelo.add(tipoGrid);

                    continue;
                }

                //checo si es booleano
                if (booleanos.contains(e.getKey())) {

                    TipoGrid tipoGrid = new TipoGrid();

                    tipoGrid.setType("bool");
                    tipoGrid.setXtype("checkbox");
                    tipoGrid.setName(e.getKey().toString());

                    listaModelo.add(tipoGrid);


                    columnas.put("xtype", "booleancolumn");
                    columnas.put("align", "center");
                    columnas.put("trueText", "Si");
                    columnas.put("falseText", "No");
                    columnas.put("width", 50);


                    HashMap xtype = new HashMap();
                    xtype.put("xtype", "checkbox");

                    columnas.put("editor", xtype);

                    continue;


                }


                if (miO.equals("java.lang.Integer") || (miO.equals("java.math.BigDecimal") && pk==true)) {

                    TipoGrid tipoGrid = new TipoGrid();
                    tipoGrid.setType("int");
                    tipoGrid.setXtype("numberfield");
                    tipoGrid.setName(e.getKey().toString());

                    listaModelo.add(tipoGrid);

                    if (pk) {
                        columnas.put("editable", false);
                        pk = false;
                        primaryKey = (String) e.getKey();
                    }

                    HashMap xtype = new HashMap();
                    xtype.put("xtype", "textfield");
                    xtype.put("allowBlank", false);
                    columnas.put("editor", xtype);

                    continue;

                }
                if (miO.equals("java.lang.String")) {

                    TipoGrid tipoGrid = new TipoGrid();

                    tipoGrid.setType("string");
                    tipoGrid.setXtype("textfield");
                    tipoGrid.setName(e.getKey().toString());
                    listaModelo.add(tipoGrid);


                    HashMap xtype = new HashMap();
                    xtype.put("xtype", "textfield");
                    xtype.put("allowBlank", false);
                    columnas.put("editor", xtype);

                    continue;

                }
                if (miO.equals("java.util.Date")) {

                    TipoGrid tipoGrid = new TipoGrid();

                    tipoGrid.setType("string");
                    tipoGrid.setXtype("datefield");
                    tipoGrid.setName(e.getKey().toString());

                    listaModelo.add(tipoGrid);


                    columnas.put("format", "d/m/Y");
                    columnas.put("renderer", "function(value){ var temp=''+value; if(value!=null && value!='' &&  temp.match('/')!='/')return value.dateFormat('d/m/Y');else return ''+value; }");

                    HashMap xtype = new HashMap();
                    xtype.put("xtype", "datefield");
                    xtype.put("allowBlank", false);
                    xtype.put("format", "d/m/Y");
                    columnas.put("editor", xtype);

                    continue;

                }
                if (miO.equals("java.math.BigDecimal")) {

                    TipoGrid tipoGrid = new TipoGrid();

                    tipoGrid.setType("float");
                    tipoGrid.setXtype("numberfield");
                    tipoGrid.setName(e.getKey().toString());

                    // columnas.put("xtype", "numbercolumn");
                    columnas.put("decimalPrecision", 10);
                    HashMap xtype = new HashMap();
                    xtype.put("xtype", "numberfield");
                    xtype.put("allowBlank", false);
                    xtype.put("decimalPrecision", 10);
                    columnas.put("editor", xtype);


                    listaModelo.add(tipoGrid);
                    continue;


                }
            }

        }


        JSONArray jsonObject = JSONArray.fromObject(listaModelo);

        jsonObject.discard("xtype");
        jsonPrimerGrid = jsonObject.toString();


        jsonObject = JSONArray.fromObject(agrega);
        objetoNuevoJson = jsonObject.toString();


        listaDatos.remove(0);
        jsonObject = JSONArray.fromObject(listaDatos);
        datosJson = jsonObject.toString();

//
//        if (listaDatos.isEmpty())
//            datosJson = objetoNuevoJson;

        jsonObject = JSONArray.fromObject(listColumnas);
        columnasJson = jsonObject.toString();


    }


%>


<script type="text/javascript">


Ext.onReady(function() {
    Ext.QuickTips.init();
    var estatusF2 = true;
    var editaBandera2=true;

    var Objeto = Ext.data.Record.create(<%=jsonPrimerGrid%>);


    var store = new Ext.data.GroupingStore({
        reader: new Ext.data.JsonReader({fields: Objeto}),
        data:<%=datosJson%>
    });


    var editor2 = new Ext.ux.grid.RowEditor({
        saveText: 'Guardar',
        listeners:{
            validateedit:function(roweditor, changes, record, number) {


                <%
                   for(TipoGrid tipoGrid:listaModelo){

                   if(!gridPojo.getCatalogos().containsKey(tipoGrid.getName())){
                %>
                var <%=tipoGrid.getName()%>Anterior = record.get('<%=tipoGrid.getName()%>');

                var <%=tipoGrid.getName()%>;

                if (changes.<%=tipoGrid.getName()%> == null)
                        <%=tipoGrid.getName()%> =
                record.get('<%=tipoGrid.getName()%>');
                else
                <%=tipoGrid.getName()%> =
                changes.<%=tipoGrid.getName()%>;

                <%
                    }else{


                 %>
                var <%=tipoGrid.getName()%>Anterior = record.get('<%=tipoGrid.getName()%>');

                var <%=tipoGrid.getName()%>;

                if (changes.<%=tipoGrid.getName()%> == null)
                        <%=tipoGrid.getName()%> =
                record.get('<%=tipoGrid.getName()%>');
                else
                <%=tipoGrid.getName()%> =
                changes.<%=tipoGrid.getName()%>;


                <%
                        }
                }
                %>

                var tipo = 'editaObjeto';
                var url = '<%=gridPojo.getUrlCambios()%>'

                if (record.get('<%=primaryKey%>') == null || record.get('<%=primaryKey%>') == 0) {

                  //  Ext.DomHelper.overwrite('SegungoGrid', '');
                    tipo = 'insert';
                    url = '<%=gridPojo.getUrlAlta()%>'
                }


                //  alert(tipo);
                mascara(true)
                Ext.Ajax.request({
                    url: url,
                    success: function(response, opts) {


                        if (record.get('<%=primaryKey%>') == null || record.get('<%=primaryKey%>') == '' || record.get('<%=primaryKey%>') == 0) {

                            var obj = Ext.decode(response.responseText);

                            // alert("obj:"+obj);
                            var rec = store.getAt(0);
                            rec.set('<%=primaryKey%>', obj);
                            rec = store.getAt(1);
                            if (rec != null && rec.get('<%=primaryKey%>') == 0)
                                store.removeAt(1);

                        }


                        mascara(false)
                        estatusF2 = true;

                    },
                    failure:function() {

                        mascara(false)


                        <%
                           for(TipoGrid tipoGrid:listaModelo){
                        %>

                        record.set('<%=tipoGrid.getName()%>', <%=tipoGrid.getName()%>Anterior);

                        <%

                        }
                        %>


                        Ext.MessageBox.alert('Error', 'No se actualizo el objeto');
                        estatusF2 = true;

                        editaBandera2=false;
                    },
                    params: {

                        <%
                           for(TipoGrid tipoGrid:listaModelo){

                        %>

                        <%=tipoGrid.getName()%>:<%=tipoGrid.getName()%>,
                        <%

                        }
                        %>
                        accion:tipo,
                        tabla:'<%=gridPojo.getNombreTabla()%>',
                        nombrePk:'<%=primaryKey%>',
                        secuencia:'<%=gridPojo.getSecuencia()%>',



                    }
                });






            },
            canceledit:function(roweditor, forced) {

                //   alert('hola')
                if (estatusF2 == false && forced == true) {

                    store.removeAt(0);
                    estatusF2 = true;
                }

                 grid2.removeBtn.setDisabled(false);

            },

            beforeedit:function(){


               grid2.removeBtn.setDisabled(true);

            },
            afteredit:function(){

                grid2.removeBtn.setDisabled(false);

            }


        }


    })
            ;

    var grid2 = new Ext.grid.GridPanel({
        store: store,
        width: 550,
        stripeRows: true,
        region:'center',
        enableColumnResize:false,
        margins: '0 5 5 5',
        // sm: new Ext.grid.RowSelectionModel({singleSelect:true}),
        plugins: [editor2],
        view: new Ext.grid.GroupingView({
            markDirty: false
        }),
        sm: new Ext.grid.RowSelectionModel({
            singleSelect: true,
            listeners: {
                rowselect:function(sm, index, record) {


                }

            }
        }),
        tbar: [
            {
                // iconCls: 'icon-user-add',
                text: 'Agregar Fila',
                handler: function() {

                    if (estatusF2) {

                        var e = new Objeto(<%=objetoNuevoJson%>);
                        editor2.stopEditing();
                        store.insert(0, e);
                        grid2.getView().refresh();
                        grid2.getSelectionModel().selectRow(0);
                        editor2.startEditing(0);
                        estatusF2 = false;

                    }


                }
            },
            '-',
            {
                ref: '../removeBtn',
                //   iconCls: 'icon-user-delete',
                text: 'Eliminar Fila',
                disabled: true,
                handler: function() {
                 //   Ext.DomHelper.overwrite('SegungoGrid', '');
                    editor2.stopEditing();
                    var s = grid2.getSelectionModel().getSelections();
                    for (var i = 0, r; r = s[i]; i++) {


                        objF = r;

                        if (r.get('<%=primaryKey%>') != 0) {
                            mascara(true)
                            Ext.Ajax.request({
                                url: '<%=gridPojo.getUrlBaja()%>',
                                success: function() {

                                    mascara(false);
                                    store.remove(objF);

                                },
                                failure:function() {

                                    mascara(false)
                                    Ext.MessageBox.alert('Error', 'No se borro el objeto');

                                },
                                params: {

                                    <%=primaryKey%>:r.get('<%=primaryKey%>'),
                                    accion:'eliminar',
                                    nombrePk:'<%=primaryKey%>',
                                    tabla:'<%=gridPojo.getNombreTabla()%>',
                                    secuencia:'<%=gridPojo.getSecuencia()%>'


                                }
                            });
                        }


                    }
                }
            }
        ],

        columns:<%=columnasJson%>
    });


    var layout2 = new Ext.Panel({
        layout: 'border',
        layoutConfig: {
            columns: 1
        },
        border:true,
        //  width:400,
        height: 200,
        items: [grid2]
    });
    layout2.render('gridPojo2');

    grid2.getSelectionModel().on('selectionchange', function(sm) {
        grid2.removeBtn.setDisabled(sm.getCount() < 1);
    });


});
</script>


<div  id="gridPojo2"  style="margin:50px" ></div>


<%
    Iterator ite = catalogos.entrySet().iterator();
    // private Map<String, Map<String, String>> catalogos;
    while (ite.hasNext()) {

        Map.Entry e = (Map.Entry) ite.next();
        //System.out.println(e.getKey() + " " + e.getValue());
        Map<String, String> valores = (Map<String, String>) e.getValue();

        Iterator ite2 = valores.entrySet().iterator();

%>

<select id="<%=e.getKey()%>combo2">
    <%
        while (ite2.hasNext()) {

            Map.Entry e2 = (Map.Entry) ite2.next();
    %>
    <option value="<%=e2.getKey()%>"><%=e2.getValue()%>
    </option>
    <%

        }

    %>
</select>

<%

    }
%>


